#include <iostream>
#include <thread>
#include <future>

int Add(int n1,int n2,std::promise<int>& p)
{
    std::cout << "-----等待promise-----" << std::endl;
    //睡眠3s
    std::this_thread::sleep_for(std::chrono::seconds(3));//chrono英文：计时
    //证明是不是 fu的get在等待 pro的set_value
    p.set_value(n1+n2);
    return n1 + n2;
}

int main(){
    //demo测试：promise 与 future的结合使用

//模板内填写的是：调用函数的返回值类型，int Add(...)
    std::promise<int> pro;
    //将future对象 fu 与 promise对象 pro 进行关联。
    std::future<int> fu = pro.get_future();

    std::thread th(Add,11,12,std::ref(pro));//使用线程调用Add函数，进行异步操作
    //ref函数获取pro的引用
    std::cout << "-----1-----" << std::endl;
    int sum = fu.get();//此时并没有使用async函数，而是通过pro与fu对关联，fu从pro设置的值中获取异步数据
    //并且fu的get与pro的set_value是同步的！！
    std::cout << "-----2-----" << std::endl;
    std::cout << sum << std::endl;

    th.join();//关闭线程
    return 0;
}
